package com.xinqi.xinqidev.ws;

import com.alibaba.fastjson.JSON;
import com.xinqi.xinqidev.config.GetHttpSessionConfig;
import com.xinqi.xinqidev.utils.MessageUtils;
import com.xinqi.xinqidev.ws.pojo.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

/**
 * 监听websocket连接
 */
@ServerEndpoint(value = "/chat", configurator = GetHttpSessionConfig.class)
@Component
@Slf4j
public class ChatEndpoint {

    private HttpSession httpSession;

    private String user;//用户名称

    private Session session;//session对象，用来发送远程的请求

    /**
     * 建立websocket连接后，被调用
     * @param session
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        //1，将session进行保存
        this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        user = (String) this.httpSession.getAttribute("user");
        log.debug("user is " + user);
        this.session = session;
    }
    /**
     * 浏览器发送消息到服务端，该方法被调用
     * 张三  -->  李四
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        try {
            //将消息推送给指定的用户
            Message msg = JSON.parseObject(message, Message.class);
            log.debug("msg is " + msg);
            //获取 消息接收方的用户名
            String toName = msg.getToName();
            String mess = msg.getMessage();
            //获取消息接收方用户对象的session对象
            String msg1 = MessageUtils.getMessage(false, "XinqiGPT", mess + "---\n from XinqiGPT");//todo
            log.debug("onMessage message is " + msg1);

            session.getBasicRemote().sendText(msg1);//发送给客户端。
        } catch (Exception e) {
            //记录日志
            log.debug("e is " + e);
        }
    }

    /**
     * 断开 websocket 连接时被调用
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        //要不要做点什么？
        System.out.println("关闭了。。。。" + session);
    }
    /**
     * 配置错误信息处理
     * @param session
     * @param t
     */
    @OnError
    public void onError(Session session, Throwable t) {
        //什么都不想打印都去掉就好了
        log.info("【websocket消息】出现未知错误 ");
        //打印错误信息，如果你不想打印错误信息，去掉就好了
        //这里打印的也是  java.io.EOFException: null
        t.printStackTrace();
    }

}
